OpenID Connect の認可コードフローを理解して使ってもらうための社内勉強会を開催しました
prismatix事業部の宮部です。
私は prismatix 認証サービス という OpenID Connect と OAuth2.0 に準拠したID製品の開発をおこなっています。
弊社ではそれ以外でも Auth0 や Cognito だったりと OpenID Connect や OAuth2.0 に触れる機会というのは多くあると思っており、この辺りについての知識をより布教していきたいと常々感じていたこともあり今回勉強会を主催しました。
勉強会の内容
以下のルールで行いました。
- 週に2回、1時間ずつ開催
- 連休前などの明らかに人が少ない日はスキップ
- ドキュメントを声に出して読む輪読会形式
- オンライン開催で Google meet を使い、読む人が画面共有でドキュメントを映す
- わからないことがあったら適宜聞く
- わかる人が答える
- 足りないところがあったら寄り道して別のドキュメントも読む
- 1セクション終わったら再度疑問がないか確認する
資料と選定理由
勉強会で使った主な資料は2つです。
OpenID Connect Basic Client Implementer's Guide 1.0
こちらは日本語訳のある OpenID Connect Basic Client Implementer's Guide 1.0 - draft 37 を使用しました。
これは OpenID Connect の認可コードフローについて、Relying Party 側の要点を押さえたサブセット的なドキュメントになっていますが注意点が2つあります。
- ドラフト版の仕様であること
- 日本語訳は 37 までしかないが、翻訳元は 42 まで出ており最新版ではないこと
選定理由
昨年 OpenID Connect Core 1.0 の輪読会が今回とほぼ同様の形式で開催されたのですが、ドキュメントの量が膨大であること、OpenID Provider と Relying Party 両方の要件が書かれているため上から読み進めていく方式だと理解がしにくい印象を受けました。( Relying Party を開発する人の方が多いと思っています)
また、ドラフト版であり日本語訳版は最新ではないという部分に関しては、事前に私が読んだところ特に大きな違和感のある部分がなかったことと、参加者の中には前回の OpenID Connect Core 1.0 の輪読会が数名いたので読み進めていく中でケアができると考えました。
以上のことから、今回は最もオーソドックスな認可コードフローであり、Relying Party の視点にのみ絞ったこのドキュメントを採用しました。
RFC 7636 (Proof Key for Code Exchange by OAuth Public Clients)
こちらも日本語訳のある RFC 7636 - Proof Key for Code Exchange by OAuth Public Clients 日本語訳 を使用しました。
これはいわゆるPKCEと呼ばれるものです。
選定理由
OpenID Connect Basic Client Implementer's Guide 1.0 や OpenID Connect Core 1.0 に記載はないですが、認可コードの横取りを防ぐために昨今ではほぼ必須の技術であると思っているため採用しました。
ちょっとした工夫
参加者について知れるようにした
勉強会参加者が初対面の方も多かったので事前に全員分のプロフィールを Proflly からもってきて輪読担当者の一覧にリンクさせていました。他の人が気づいていたかはわかりませんが自分としては普段関わりのない人が参加してくれていることを再認識できて嬉しかったです。
シーケンス図を準備した
ドキュメントだけだとイメージがしにくいという声を受けて Notion に Mermaid で認可コードフローのシーケンス図を用意しました。
UML で描くことはよくあるのですが、Mermaid は初めて使ったのでそこも学びでしたし、作成したシーケンス図が他のところでも使われることを期待しています。
所感
最終的に10人ほど集まり個人的には嬉しかったです。
冒頭の画像にもあったアクセストークンと ID トークンの違いや、 state nonce PKCE についての質問も多く受けながらドキュメントを読み進めていくことで全員での理解が深まったと感じています。きっと OAuth 認証の問題点も理解してくれたことでしょう。
忘れていた仕様も多々あったので定期的な読み直しの必要性を感じました。
今後も社内で認証認可について啓蒙をしていきたい所存です。